from flask import Flask, request, jsonify
from flask_cors import CORS
import logging

# 配置日志
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)

app = Flask(__name__)
CORS(app)  # 允许跨域请求

# 加密函数：将明文转换为由"玛"、"卡"、"巴"组成的密文
def encrypt_text(text):
    logger.debug(f'加密函数输入: {text}')
    result = ''
    for i in range(len(text)):
        char_code = ord(text[i])
        logger.debug(f'字符: {text[i]}, 编码: {char_code}')
        # 使用三个基本字和分隔符来表示字符
        mkb_part = char_to_mkb(char_code)
        logger.debug(f'转换后的玛卡巴: {mkb_part}')
        result += mkb_part
        # 除了最后一个字符外，都添加分隔符
        if i < len(text) - 1:
            result += '咔'
            logger.debug(f'添加分隔符后的结果: {result}')
    logger.debug(f'最终加密结果: {result}')
    return result
# 解密函数：将密文还原为明文
def decrypt_text(encrypted_text):
    logger.debug(f'解密函数输入: {encrypted_text}')
    encrypted_parts = encrypted_text.split('咔')
    logger.debug(f'拆分后的密文部分: {encrypted_parts}')
    result = ''
    
    for part in encrypted_parts:
        # 只处理有效的12个字符的部分
        if len(part) == 12:
            logger.debug(f'处理密文部分: {part}')
            char_code = mkb_to_char(part)
            logger.debug(f'转换后的字符编码: {char_code}')
            if char_code is not None:
                result += chr(char_code)
                logger.debug(f'当前解密结果: {result}')
        else:
            logger.debug(f'跳过无效密文部分(长度不是12): {part}')
    
    logger.debug(f'最终解密结果: {result}')
    return result

# 将字符编码转换为"玛卡巴"组合
def char_to_mkb(char_code):
    # 使用三个基本字的不同组合来表示不同的字符
    # 玛=0, 卡=1, 巴=2
    # 使用12个三进制位，因为3^12 > 65535（Unicode基本平面）
    result = ''
    code = char_code
    
    # 计算12个三进制位
    for _ in range(12):
        remainder = code % 3
        code = code // 3
        
        if remainder == 0:
            result = '玛' + result
        elif remainder == 1:
            result = '卡' + result
        elif remainder == 2:
            result = '巴' + result
    
    return result

# 将"玛卡巴"组合转换为字符编码
def mkb_to_char(mkb_string):
    logger.debug(f'mkb_to_char输入: {mkb_string}')
    # 检查输入是否有效
    if not mkb_string or len(mkb_string) != 12:
        logger.debug(f'输入无效: 长度不是12个字符')
        return None
    
    code = 0
    # 对于每个字符，计算其在三进制中的位置值
    # 最左边的字符对应3^11，然后依次是3^10, 3^9, ..., 3^0
    power = 11  # 从最高位3^11开始
    for char in mkb_string:
        if char == '玛':
            value = 0
        elif char == '卡':
            value = 1
        elif char == '巴':
            value = 2
        else:
            logger.debug(f'无效字符: {char}')
            return None
        
        # 计算该位的贡献值并累加到code中
        contribution = value * (3 ** power)
        code += contribution
        logger.debug(f'字符: {char}, 位置权重: 3^{power}, 贡献值: {contribution}, 当前编码: {code}')
        power -= 1  # 移动到下一个低位
    
    logger.debug(f'mkb_to_char输出: {code}')
    return code

# 加密API接口
@app.route('/api/encrypt', methods=['POST'])
def api_encrypt():
    data = request.get_json()
    if not data or 'text' not in data:
        return jsonify({'error': '请提供要加密的文字'}), 400
    
    try:
        encrypted_text = encrypt_text(data['text'])
        return jsonify({'encrypted_text': encrypted_text})
    except Exception as e:
        return jsonify({'error': str(e)}), 500

# 解密API接口
@app.route('/api/decrypt', methods=['POST'])
def api_decrypt():
    data = request.get_json()
    if not data or 'text' not in data:
        return jsonify({'error': '请提供要解密的文字'}), 400
    
    try:
        decrypted_text = decrypt_text(data['text'])
        return jsonify({'decrypted_text': decrypted_text})
    except Exception as e:
        return jsonify({'error': str(e)}), 500

# 测试函数：验证加密和解密函数的正确性
def test_encryption_decryption():
    test_texts = ['hello', '你好', '测试', '123']
    for text in test_texts:
        logger.debug(f'\n===== 测试文本: "{text}" =====')
        encrypted = encrypt_text(text)
        decrypted = decrypt_text(encrypted)
        logger.debug(f'加密结果: {encrypted}')
        logger.debug(f'解密结果: {decrypted}')
        logger.debug(f'解密正确: {text == decrypted}')
    logger.debug('\n===== 测试完成 =====')

# 健康检查接口
@app.route('/api/health', methods=['GET'])
def health_check():
    return jsonify({'status': 'ok'})

# 测试接口：用于测试加密和解密函数
@app.route('/api/test', methods=['GET'])
def test_api():
    test_encryption_decryption()
    return jsonify({'status': 'test_completed'})

if __name__ == '__main__':
    # 先运行一个简单的测试来验证修复
    print("\n===== 修复验证测试 =====")
    test_text = "test123"
    encrypted = encrypt_text(test_text)
    decrypted = decrypt_text(encrypted)
    print(f'测试文本: {test_text}')
    print(f'加密结果: {encrypted}')
    print(f'解密结果: {decrypted}')
    print(f'解密正确: {test_text == decrypted}')
    print("==========================\n")
    
    # 在启动服务前运行测试
    test_encryption_decryption()
    app.run(host='0.0.0.0', port=5000, debug=True)